Scheduler for UWP | ComponentOne
Features / Appointments / Customizing the Edit Appointment Dialog
In This Topic
    Customizing the Edit Appointment Dialog
    In This Topic

    You can easily customize the Edit Appointment Dialog by customizing the EditAppointmentControl.xaml file.

    Add a new UserControl to your application:

    1. Right-click your application name and select Add | New Item from the context menu.
    2. Select User Control from the Add New Item dialog.
    3. Name your new User Control EditAppointmentControl and click OK. The control will be added to your application.

    Open your EditAppointmentControl.xaml file and add the XAML markup from the top of the page. You can edit this markup to customize the New Appointment Dialog.

    XAML
    Copy Code
    <UserControl xmlns:DateTimeEditors="using:C1.Xaml.DateTimeEditors" x:Class="CustomizeEditAppointmentControl_UWP.EditAppointmentControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CustomizeEditAppointmentControl_UWP" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:c1="using:C1.Xaml" Loaded="EditAppointmentControl_Loaded"
    x:Name="root" DataContextChanged="OnDataContextChanged" mc:Ignorable="d" Height="683.197" Width="805.114">
      <UserControl.Resources>
        <ResourceDictionary>
          <ResourceDictionary.ThemeDictionaries>
            <ResourceDictionary x:Key="Default">
              <SolidColorBrush x:Key="RoundButtonForegroundThemeBrush" Color="#FF24AAD8" />
              <SolidColorBrush x:Key="RoundButtonPointerOverBackgroundThemeBrush" Color="#2124AAD8" />
            </ResourceDictionary>
            <ResourceDictionary x:Key="Light">
              <SolidColorBrush x:Key="RoundButtonForegroundThemeBrush" Color="#FF24AAD8" />
              <SolidColorBrush x:Key="RoundButtonPointerOverBackgroundThemeBrush" Color="#2124AAD8" />
            </ResourceDictionary>
            <ResourceDictionary x:Key="HighContrast">
              <SolidColorBrush x:Key="RoundButtonForegroundThemeBrush" Color="#FFFFFFFF" />
              <SolidColorBrush x:Key="RoundButtonPointerOverBackgroundThemeBrush" Color="#FF008000" />
            </ResourceDictionary>
            <ResourceDictionary x:Key="HighContrastBlack">
              <SolidColorBrush x:Key="RoundButtonForegroundThemeBrush" Color="#FFFFFFFF" />
              <SolidColorBrush x:Key="RoundButtonPointerOverBackgroundThemeBrush" Color="#FF1AEBFF" />
            </ResourceDictionary>
            <ResourceDictionary x:Key="HighContrastWhite">
              <SolidColorBrush x:Key="RoundButtonForegroundThemeBrush" Color="#FF000000" />
              <SolidColorBrush x:Key="RoundButtonPointerOverBackgroundThemeBrush" Color="#FF37006E" />
            </ResourceDictionary>
          </ResourceDictionary.ThemeDictionaries>
          <SolidColorBrush x:Key="highlightBrush" Color="{ThemeResource SystemColorHotlightColor}" />
          <Style x:Key="roundButtonStyle" TargetType="Button">
            <Setter Property="MinWidth" Value="0"/> <Setter Property="Width" Value="42"/>
                <Setter Property="Height" Value="42"/> <Setter Property="Margin" Value="0"/>
                <Setter Property="VerticalAlignment" Value="Bottom"/>
                <Setter Property="Foreground" Value="{ThemeResource RoundButtonForegroundThemeBrush}"/>
                <Setter Property="FontFamily" Value="Segoe UI Symbol"/>
                <Setter Property="FontWeight" Value="Normal"/>
                <Setter Property="FontSize" Value="20"/>
                <Setter Property="AutomationProperties.AutomationId" Value="BackButton"/>
                <Setter Property="AutomationProperties.Name" Value="Back"/>
                <Setter Property="AutomationProperties.ItemType" Value="Navigation Button"/>
                <Setter Property="Template"> <Setter.Value>
                <ControlTemplate TargetType="Button">
                <Grid x:Name="RootGrid">
                <Grid >
               <Rectangle x:Name="FocusVisualWhite" Margin="-3" IsHitTestVisible="False" Stroke="{ThemeResource FocusVisualWhiteStrokeThemeBrush}" StrokeEndLineCap="Square" StrokeDashArray="1,1" Opacity="0" StrokeDashOffset="1.5" />
               <Rectangle x:Name="FocusVisualBlack" Margin="-3" IsHitTestVisible="False" Stroke="{ThemeResource FocusVisualBlackStrokeThemeBrush}" StrokeEndLineCap="Square" StrokeDashArray="1,1" Opacity="0" StrokeDashOffset="0.5" />
               <Ellipse Stroke="{TemplateBinding Foreground}" StrokeThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
               <Ellipse x:Name="BackgroundGlyph" Stroke="{TemplateBinding Foreground}" StrokeThickness="2" Fill="{TemplateBinding Foreground}" Opacity="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
               <TextBlock x:Name="NormalGlyph" Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}" VerticalAlignment="Center" HorizontalAlignment="Center" />
               <TextBlock x:Name="ArrowGlyph" Text="{TemplateBinding Content}" Foreground="{ThemeResource BackButtonPressedForegroundThemeBrush}" VerticalAlignment="Center" HorizontalAlignment="Center" />
                   </Grid>
                   </Grid>
                  </ControlTemplate>
                 </Setter.Value>
               </Setter>
          </Style>
          <DataTemplate x:Key="BaseObjectItemPictTextTemplate">
            <Grid Background="Transparent">
              <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" />
                <ColumnDefinition />
              </Grid.ColumnDefinitions>
              <Border Name="imageBorder" BorderBrush="Black" BorderThickness="1" CompositeMode="MinBlend" Height="18" Width="18" Background="{Binding Brush.Brush}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="6,2">
              </Border>
              <TextBlock Grid.Column="1" Text="{Binding Text}" VerticalAlignment="Center" />
            </Grid>
          </DataTemplate>
        </ResourceDictionary>
      </UserControl.Resources>
    
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto" />
          <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="Auto" MinWidth="320" />
          <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <Rectangle Grid.Column="0" Grid.RowSpan="2">
          <Rectangle.Fill>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
              <GradientStop Color="#FF5B9E5B" Offset="0.439" />
              <GradientStop Color="#FF0A630A" Offset="0.703" />
              <GradientStop Color="#FF368136" Offset="0.123" />
            </LinearGradientBrush>
          </Rectangle.Fill>
        </Rectangle>
        <Rectangle Grid.Column="1" Grid.RowSpan="2">
          <Rectangle.Fill>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
              <GradientStop Color="#FF1B4B1B" Offset="0.394" />
              <GradientStop Color="#FF407848" Offset="0.048" />
              <GradientStop Color="#FF349B34" Offset="0.697" />
            </LinearGradientBrush>
          </Rectangle.Fill>
        </Rectangle>
        <Grid Grid.Row="0" Grid.Column="0" VerticalAlignment="Center">
          <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition/>
          </Grid.ColumnDefinitions>
          <Button x:Name="backButton" Click="backButton_Click" Grid.Column="0" Content="&#xE112;" TabIndex="4" ToolTipService.ToolTip="{Binding backButton_ToolTip}" Margin="22, 10, 10, 10" VerticalAlignment="Center" Style="{StaticResource roundButtonStyle}" Background="#FF060606"
          Foreground="White" />
          <TextBlock Margin="5" Text="{Binding Header, ElementName=root}" TextWrapping="NoWrap" TextTrimming="CharacterEllipsis" Grid.Column="1" FontSize="18" MaxWidth="240" VerticalAlignment="Center" />
        </Grid>
        <Grid Grid.Row="0" Grid.Column="1" VerticalAlignment="Center">
          <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="Auto" />
          </Grid.ColumnDefinitions>
          <Rectangle Height="2" Fill="{StaticResource highlightBrush}" Grid.ColumnSpan="3" Margin="30,0,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Right" />
          <TextBox x:Name="subject" TabIndex="0" Padding="2" BorderThickness="0" PlaceholderText="{Binding subjectPlaceHolder}" Margin="30,0,0,1" Text="{Binding Subject, Mode=TwoWay}" TextChanged="subject_TextChanged" FontSize="18" Grid.Column="0" MaxLength="255"
          IsColorFontEnabled="True" VerticalAlignment="Center" />
          <Button x:Name="saveButton" Click="saveButton_Click" Grid.Column="1" Content="&#xE105;" TabIndex="1" ToolTipService.ToolTip="{Binding saveButton_ToolTip}" Margin="10" VerticalAlignment="Center" Style="{StaticResource roundButtonStyle}" Foreground="White" />
          <Button x:Name="deleteButton" Grid.Column="2" Content="&#xE106;" TabIndex="2" ToolTipService.ToolTip="{Binding deleteButton_ToolTip1}" Margin="10" VerticalAlignment="Center" Style="{StaticResource roundButtonStyle}" Foreground="White" />
        </Grid>
        <StackPanel Grid.Column="0" Grid.Row="1" Margin="20, 10, 10, 10">
          <!-- dates and times -->
          <TextBlock Margin="5,5,5,0" Text="{Binding startTime}" />
          <DateTimeEditors:C1DateTimePicker x:Name="startCalendar" Margin="5" TabIndex="5" DateTimeChanged="startCalendar_DateTimeChanged" Padding="4" TimeFormat="ShortTime" DateFormat="Short" TimeIncrement="0:15" FirstDayOfWeek="{Binding Path=ParentCollection.ParentStorage.ScheduleStorage.Scheduler.CalendarHelper.WeekStart}" />
          <!-- End -->
          <TextBlock Margin="5,5,5,0" Text="{Binding endTime}" />
          <DateTimeEditors:C1DateTimePicker x:Name="endCalendar" Margin="5" TabIndex="6" Padding="4" DateTimeChanged="endCalendar_DateTimeChanged" FirstDayOfWeek="{Binding Path=ParentCollection.ParentStorage.ScheduleStorage.Scheduler.CalendarHelper.WeekStart}"
          TimeFormat="ShortTime" DateFormat="Short" TimeIncrement="0:15" />
          <!-- All Day -->
          <CheckBox x:Name="chkAllDay" Checked="chkAllDay_Checked" Unchecked="chkAllDay_Unchecked" TabIndex="7" Margin="5" IsChecked="{Binding AllDayEvent, Mode=TwoWay}" Content="{Binding allDayEvent}" />
          <!-- location -->
          <TextBox x:Name="location" Margin="5" IsColorFontEnabled="True" TabIndex="8" Header="{Binding location}" Text="{Binding Location, Mode=TwoWay}" MaxLength="255" />
          <!-- recurrence -->
          <ComboBox x:Name="howOften" SelectionChanged="howOften_SelectionChanged" TabIndex="9" Header="{Binding howOftenComboBoxHeader}" MinWidth="140" Margin="5" />
          <StackPanel x:Name="recPanel">
            <CheckBox x:Name="recEndDateSet" Margin="5" Checked="recEndDateSet_Checked" Unchecked="recEndDateSet_Unchecked" TabIndex="10" Content="{Binding recEndDate}" />
            <DateTimeEditors:C1DateTimePicker x:Name="recEndDate" Margin="5" IsEnabled="{Binding IsChecked, ElementName=recEndDateSet}" TabIndex="11" Padding="4" DateFormat="Short" EditMode="Date" DateTimeChanged="recEndDate_DateTimeChanged" FirstDayOfWeek="{Binding Path=ParentCollection.ParentStorage.ScheduleStorage.Scheduler.CalendarHelper.WeekStart}" />
          </StackPanel>
          <!-- reminder -->
          <CheckBox x:Name="reminderSet" IsChecked="{Binding ReminderSet, Mode=TwoWay}" Margin="5" TabIndex="12" Content="{Binding reminderSet}" />
          <DateTimeEditors:C1TimeEditor x:Name="reminderTime" TabIndex="13" Format="TimeSpan" Padding="4" Margin="5" IsEnabled="{Binding Path=IsChecked, ElementName=reminderSet}" Increment="00:05" CycleChangesOnBoundaries="False" AllowNull="False" Minimum="0:00"
          Maximum="14.00:00" />
          <!-- other props -->
          <ComboBox x:Name="status" TabIndex="14" ItemTemplate="{StaticResource BaseObjectItemPictTextTemplate}" ItemsSource="{Binding ParentCollection.ParentStorage.ScheduleStorage.StatusStorage.Statuses}" SelectedItem="{Binding Path=BusyStatus, Mode=TwoWay}"
          Header="{Binding showTimeAs}" MinWidth="140" Padding="0" Margin="5" />
          <ComboBox Grid.Row="1" TabIndex="15" ItemTemplate="{StaticResource BaseObjectItemPictTextTemplate}" ItemsSource="{Binding ParentCollection.ParentStorage.ScheduleStorage.LabelStorage.Labels}" SelectedItem="{Binding Path=Label, Mode=TwoWay}" Header="{Binding label}"
          MinWidth="140" Padding="0" Margin="5" />
          <CheckBox IsChecked="{Binding Path=Private, Mode=TwoWay}" Margin="5" TabIndex="16" Content="{Binding private_}" />
        </StackPanel>
        <TextBox x:Name="body" Text="{Binding Body, Mode=TwoWay}" Grid.Column="1" Grid.Row="1" TextWrapping="Wrap" TabIndex="3" AcceptsReturn="True" IsSpellCheckEnabled="True" IsColorFontEnabled="True" ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.VerticalScrollBarVisibility="Auto"
        BorderThickness="0" Margin="30,0,0,0" PlaceholderText="Add text" Foreground="#FFD6FFD0">
          <TextBox.Background>
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
              <GradientStop Color="#FF9DEE68" Offset="0.345" />
              <GradientStop Color="#FF68914D" Offset="0.79" />
              <GradientStop Color="#FF4C8029" Offset="0.103" />
            </LinearGradientBrush>
          </TextBox.Background>
        </TextBox>
      </Grid>
    </UserControl>
    

    Add the following code to the EditAppointmentControl.xaml.cs file.

    C#
    Copy Code
    using C1.C1Schedule;
    using C1.Xaml;
    using C1.Xaml.Schedule;
    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices.WindowsRuntime;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;
    
    // The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236
    
    namespace CustomizeEditAppointmentControl_UWP
    {
        public sealed partial class EditAppointmentControl : UserControl
        {
            #region ** fields
            private C1FullscreenDialog _parentWindow = null;
            private Appointment _appointment;
            private C1Scheduler _scheduler;
            private bool _isLoaded = false;
            private TimeSpan _defaultStart;
            private TimeSpan _defaultDuration;
            private bool _updatingRecurrence = false;
            #endregion
    
            #region ** initialization
     /// Creates the new instance of the class. /// 
            public EditAppointmentControl()
            {
                this.InitializeComponent();
    
                // fill recurrence combo
                List recTypes = new List();
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recOnce);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recDaily);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recWeekdays);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recMonday);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recTuesday);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recWeekly);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recMonthly);
                recTypes.Add(C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.recYearly);
                howOften.ItemsSource = recTypes;
            }
    
            private void OnDataContextChanged(FrameworkElement sender, DataContextChangedEventArgs args)
            {
                if (DataContext != null)
                {
                    _appointment = DataContext as Appointment;
                    _defaultStart = _appointment.AllDayEvent ? TimeSpan.FromHours(8) : _appointment.Start.TimeOfDay;
                    _defaultDuration = _appointment.AllDayEvent ? TimeSpan.FromMinutes(30) : _appointment.Duration;
                    if (_appointment != null)
                    {
                        if (_appointment.ParentCollection != null)
                        {
                            //_scheduler = _appointment.ParentCollection.ParentStorage.ScheduleStorage.Scheduler;
                            _scheduler = MainPage.scheduler;
                            if (_appointment.AllDayEvent)
                            {
                                _defaultStart = _scheduler.CalendarHelper.StartDayTime;
                                _defaultDuration = _scheduler.CalendarHelper.Info.TimeScale;
                            }
                        }
                        UpdateWindowHeader();
                        UpdateRecurrenceState();
                        reminderTime.Value = _appointment.ReminderTimeBeforeStart;
                        UpdateCalendars();
                        if (_appointment.AllDayEvent)
                        {
                            startCalendar.EditMode = endCalendar.EditMode = C1.Xaml.DateTimeEditors.C1DateTimePickerEditMode.Date;
                        }
                        else
                        {
                            startCalendar.EditMode = endCalendar.EditMode = C1.Xaml.DateTimeEditors.C1DateTimePickerEditMode.DateTime;
                        }
                    }
                }
            }
    
            private void EditAppointmentControl_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
            {
                if (!_isLoaded)
                {
                    _parentWindow = (C1FullscreenDialog)VTreeHelper.GetParentOfType(this, typeof(C1FullscreenDialog));
                    if (_parentWindow != null && _appointment != null)
                    {
                        _parentWindow.Unloaded += _parentWindow_Unloaded;
                        _isLoaded = true;
                    }
                }
                subject.Focus(Windows.UI.Xaml.FocusState.Programmatic);
            }
            void _parentWindow_Unloaded(object sender, RoutedEventArgs e)
            {
                _parentWindow.Unloaded -= _parentWindow_Unloaded;
                DataContext = null;
                _scheduler = null;
                _appointment = null;
                _parentWindow = null;
            }
            #endregion
    
            #region ** object model
     /// Gets or sets an object representing current DataContext. /// 
            public Appointment Appointment
            {
                get
                {
                    return _appointment;
                }
                set
                {
                    _appointment = value;
                    if (_parentWindow != null)
                    {
                        _parentWindow.Content =
                        _parentWindow.DataContext = value;
                    }
                    DataContext = value;
                    if (_appointment != null)
                    {
                        UpdateWindowHeader();
                        UpdateRecurrenceState();
                    }
                }
            }
    
     /// Gets a value which can be used as an Appointment window header. /// 
            public string Header
            {
                get { return (string)GetValue(HeaderProperty); }
                private set { SetValue(HeaderProperty, value); }
            }
    
     /// Identifies the dependency property. /// 
            private static readonly DependencyProperty HeaderProperty =
                DependencyProperty.Register("Header", typeof(string),
                typeof(EditAppointmentControl), new PropertyMetadata(string.Empty));
            #endregion
    
            #region ** recurrence properties
            private void UpdateRecurrenceState()
            {
                if (_appointment == null || _updatingRecurrence)
                {
                    return;
                }
                if (_appointment.RecurrenceState == RecurrenceStateEnum.NotRecurring)
                {
                    recPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                    howOften.IsEnabled = true;
                    howOften.SelectedIndex = 0;
                }
                else
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    switch (pattern.RecurrenceType)
                    {
                        case RecurrenceTypeEnum.Daily:
                            howOften.SelectedIndex = 1;
                            break;
                        case RecurrenceTypeEnum.Workdays:
                            howOften.SelectedIndex = 2;
                            break;
                        case RecurrenceTypeEnum.Weekly:
                            WeekDaysEnum mask = pattern.DayOfWeekMask;
                            if ((mask & WeekDaysEnum.Monday) == WeekDaysEnum.Monday
                                && (mask & WeekDaysEnum.Wednesday) == WeekDaysEnum.Wednesday
                                && (mask & WeekDaysEnum.Friday) == WeekDaysEnum.Friday
                                && (mask & WeekDaysEnum.Tuesday) != WeekDaysEnum.Tuesday)
                            {
                                howOften.SelectedIndex = 3;
                            }
                            else if ((mask & WeekDaysEnum.Tuesday) == WeekDaysEnum.Tuesday && (mask & WeekDaysEnum.Thursday) == WeekDaysEnum.Thursday)
                            {
                                howOften.SelectedIndex = 4;
                            }
                            else
                            {
                                howOften.SelectedIndex = 5;
                            }
                            break;
                        case RecurrenceTypeEnum.Monthly:
                            howOften.SelectedIndex = 6;
                            break;
                        case RecurrenceTypeEnum.Yearly:
                            howOften.SelectedIndex = 7;
                            break;
                    }
                    if (_appointment.RecurrenceState == RecurrenceStateEnum.Master)
                    {
                        recPanel.Visibility = Windows.UI.Xaml.Visibility.Visible;
                        howOften.IsEnabled = true;
                        recEndDate.DateTime = pattern.PatternEndDate;
                        recEndDateSet.IsChecked = !pattern.NoEndDate;
                    }
                    else
                    {
                        // occurrence
                        recPanel.Visibility = Windows.UI.Xaml.Visibility.Collapsed;
                        howOften.IsEnabled = false;
                    }
                }
            }
            private void howOften_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (_appointment == null)
                {
                    return;
                }
                _updatingRecurrence = true;
                if (howOften.SelectedIndex == 0)
                {
                    _appointment.ClearRecurrencePattern();
                }
                else
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    switch (howOften.SelectedIndex)
                    {
                        case 1:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Daily;
                            break;
                        case 2:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Workdays;
                            break;
                        case 3:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Weekly;
                            pattern.DayOfWeekMask = WeekDaysEnum.Monday | WeekDaysEnum.Wednesday | WeekDaysEnum.Friday;
                            break;
                        case 4:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Weekly;
                            pattern.DayOfWeekMask = WeekDaysEnum.Tuesday | WeekDaysEnum.Thursday;
                            break;
                        case 5:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Weekly;
                            pattern.DayOfWeekMask = (WeekDaysEnum)Enum.Parse(typeof(WeekDaysEnum), Enum.GetName(typeof(DayOfWeek), _appointment.Start.DayOfWeek), true);
                            break;
                        case 6:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Monthly;
                            pattern.DayOfMonth = _appointment.Start.Day;
                            break;
                        case 7:
                            pattern.RecurrenceType = RecurrenceTypeEnum.Yearly;
                            pattern.DayOfMonth = _appointment.Start.Day;
                            pattern.MonthOfYear = _appointment.Start.Month;
                            break;
                    }
                }
                _updatingRecurrence = false;
                UpdateRecurrenceState();
                UpdateCalendars();
            }
            private void recEndDateSet_Unchecked(object sender, RoutedEventArgs e)
            {
                if (_appointment != null && _appointment.RecurrenceState == RecurrenceStateEnum.Master)
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    pattern.NoEndDate = true;
                }
            }
            private void recEndDateSet_Checked(object sender, RoutedEventArgs e)
            {
                if (_appointment != null && _appointment.RecurrenceState == RecurrenceStateEnum.Master)
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    pattern.NoEndDate = false;
                    pattern.PatternEndDate = recEndDate.DateTime.Value;
                }
            }
            private void recEndDate_DateTimeChanged(object sender, object e)
            {
                if (_appointment != null && _appointment.RecurrenceState == RecurrenceStateEnum.Master)
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    pattern.PatternEndDate = recEndDate.DateTime.Value;
                }
            }
            #endregion
            //-----------------------------------------------------------------------------------
            #region ** times
            private void startCalendar_DateTimeChanged(object sender, object e)
            {
                if (_appointment != null)
                {
                    _appointment.Start = startCalendar.DateTime.Value;
                    if (_appointment.RecurrenceState == RecurrenceStateEnum.Master)
                    {
                        RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                        pattern.PatternStartDate = startCalendar.DateTime.Value;
                        pattern.StartTime = _appointment.Start;
                    }
                    UpdateCalendars();
                }
            }
            private void chkAllDay_Checked(object sender, RoutedEventArgs e)
            {
                if (_appointment.RecurrenceState == RecurrenceStateEnum.Master)
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    pattern.StartTime = _appointment.Start;
                    pattern.Duration = _appointment.Duration;
                }
                startCalendar.EditMode = endCalendar.EditMode = C1.Xaml.DateTimeEditors.C1DateTimePickerEditMode.Date;
                UpdateWindowHeader();
                UpdateCalendars();
            }
            private void chkAllDay_Unchecked(object sender, RoutedEventArgs e)
            {
                _appointment.Start = _appointment.Start.Add(_defaultStart);
                _appointment.Duration = _defaultDuration;
                if (_appointment.RecurrenceState == RecurrenceStateEnum.Master)
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    pattern.StartTime = _appointment.Start;
                    pattern.Duration = _appointment.Duration;
                }
                startCalendar.EditMode = endCalendar.EditMode = C1.Xaml.DateTimeEditors.C1DateTimePickerEditMode.DateTime;
                UpdateWindowHeader();
                UpdateCalendars();
            }
            private void endCalendar_DateTimeChanged(object sender, object e)
            {
                if (_appointment != null)
                {
                    DateTime end = endCalendar.DateTime.Value;
                    if (_appointment.AllDayEvent)
                    {
                        end = end.AddDays(1);
                    }
                    if (end < Appointment.Start)
                    {
                        endCalendar.BorderBrush = endCalendar.Foreground = new SolidColorBrush(Colors.Red);
                        endCalendar.BorderThickness = new Thickness(2);
                        ToolTipService.SetToolTip(endCalendar, C1.Silverlight.Schedule.Resources.C1_Schedule_Exceptions.StartEndValidationFailed);
                        saveButton.IsEnabled = false;
                    }
                    else
                    {
                        _appointment.End = end;
                        if (!saveButton.IsEnabled)
                        {
                            saveButton.IsEnabled = true;
                            endCalendar.ClearValue(Control.ForegroundProperty);
                            endCalendar.ClearValue(Control.BorderBrushProperty);
                            endCalendar.ClearValue(Control.BorderThicknessProperty);
                            endCalendar.ClearValue(ToolTipService.ToolTipProperty);
                        }
                    }
                    if (_appointment.RecurrenceState == RecurrenceStateEnum.Master)
                    {
                        RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                        pattern.StartTime = _appointment.Start;
                        pattern.Duration = _appointment.Duration;
                    }
                }
            }
            private void UpdateCalendars()
            {
                if (_appointment.RecurrenceState == RecurrenceStateEnum.Master)
                {
                    RecurrencePattern pattern = _appointment.GetRecurrencePattern();
                    startCalendar.DateTime = pattern.StartTime;
                    DateTime end = pattern.EndTime;
                    if (_appointment.AllDayEvent)
                    {
                        end = end.AddDays(-1);
                    }
                    endCalendar.DateTime = end;
                }
                else
                {
                    startCalendar.DateTime = _appointment.Start;
                    DateTime end = _appointment.End;
                    if (_appointment.AllDayEvent)
                    {
                        end = end.AddDays(-1);
                    }
                    endCalendar.DateTime = end;
                }
                if (!saveButton.IsEnabled)
                {
                    saveButton.IsEnabled = true;
                    endCalendar.ClearValue(Control.BackgroundProperty);
                    endCalendar.ClearValue(Control.ForegroundProperty);
                    endCalendar.ClearValue(Control.BorderBrushProperty);
                    endCalendar.ClearValue(Control.BorderThicknessProperty);
                    endCalendar.ClearValue(ToolTipService.ToolTipProperty);
                }
            }
            #endregion
            //-----------------------------------------------------------------------------------
            #region ** misc props
            private void UpdateWindowHeader()
            {
                string result;
                string subject = string.Empty;
                bool allDay = false;
                if (_appointment != null)
                {
                    subject = _appointment.Subject;
                    allDay = chkAllDay.IsChecked.Value;
                }
                if (String.IsNullOrEmpty(subject))
                {
                    subject = C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.Untitled;
                }
                if (allDay)
                {
                    result = C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.Event + " - " + subject;
                }
                else
                {
                    result = C1.Silverlight.Schedule.Resources.C1_Schedule_EditAppointment.Appointment + " - " + subject;
                }
                Header = result;
            }
            private void subject_TextChanged(object sender, TextChangedEventArgs e)
            {
                subject.GetBindingExpression(TextBox.TextProperty).UpdateSource();
                UpdateWindowHeader();
            }
            #endregion
            //-----------------------------------------------------------------------------------
            #region ** navigation
            private void saveButton_Click(object sender, RoutedEventArgs e)
            {
                _appointment.ReminderTimeBeforeStart = reminderTime.Value.Value;
                subject.Focus(Windows.UI.Xaml.FocusState.Programmatic);
                location.GetBindingExpression(TextBox.TextProperty).UpdateSource();
                body.GetBindingExpression(TextBox.TextProperty).UpdateSource();
                _parentWindow.DialogResult = MessageBoxResult.OK;
            }
            private void backButton_Click(object sender, RoutedEventArgs e)
            {
                _parentWindow.DialogResult = MessageBoxResult.Cancel;
            }
    #pragma warning disable 1591
            protected override void OnKeyDown(Windows.UI.Xaml.Input.KeyRoutedEventArgs e)
            {
                if (e.Key == Windows.System.VirtualKey.Escape)
                {
                    backButton_Click(null, null);
                }
                else if (e.Key == Windows.System.VirtualKey.S && KeyboardUtil.Ctrl)
                {
                    saveButton_Click(null, null);
                }
                else if (e.Key == Windows.System.VirtualKey.D && KeyboardUtil.Ctrl)
                {
                    _scheduler.DeleteAppointment(_appointment.Tag as Appointment);
                }
                base.OnKeyDown(e);
            }
    #pragma warning restore 1591
            #endregion
        }
    }
    

    Now that you have a custom dialog, define a DataTemplate in your Page's resources that will load the user control:

    XAML
    Copy Code
    <Page.Resources>
        <DataTemplate x:Key="customEditAppointmentTemplate">
            <local:EditAppointmentControl/>
        </DataTemplate>
    </Page.Resources>
    

    Lastly, set the EditAppointmentTemplate property on the C1Scheduler control.

    XAML
    Copy Code
    <Schedule:C1Scheduler x:Name="c1Scheduler" EditAppointmentTemplate="{StaticResource customEditAppointmentTemplate}" />
    

    You're done! When you open the Edit Appointment Dialog, your customization will be apparent .